home *** CD-ROM | disk | FTP | other *** search
- package java.util;
-
- import java.lang.ref.ReferenceQueue;
-
- public class WeakHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {
- private static final int DEFAULT_INITIAL_CAPACITY = 16;
- private static final int MAXIMUM_CAPACITY = 1073741824;
- private static final float DEFAULT_LOAD_FACTOR = 0.75F;
- private Entry[] table;
- private int size;
- private int threshold;
- private final float loadFactor;
- private final ReferenceQueue<K> queue;
- private volatile int modCount;
- private static final Object NULL_KEY = new Object();
- private transient Set<Map.Entry<K, V>> entrySet;
-
- public WeakHashMap(int var1, float var2) {
- this.queue = new ReferenceQueue();
- this.entrySet = null;
- if (var1 < 0) {
- throw new IllegalArgumentException("Illegal Initial Capacity: " + var1);
- } else {
- if (var1 > 1073741824) {
- var1 = 1073741824;
- }
-
- if (!(var2 <= 0.0F) && !Float.isNaN(var2)) {
- int var3;
- for(var3 = 1; var3 < var1; var3 <<= 1) {
- }
-
- this.table = new Entry[var3];
- this.loadFactor = var2;
- this.threshold = (int)((float)var3 * var2);
- } else {
- throw new IllegalArgumentException("Illegal Load factor: " + var2);
- }
- }
- }
-
- public WeakHashMap(int var1) {
- this(var1, 0.75F);
- }
-
- public WeakHashMap() {
- this.queue = new ReferenceQueue();
- this.entrySet = null;
- this.loadFactor = 0.75F;
- this.threshold = 16;
- this.table = new Entry[16];
- }
-
- public WeakHashMap(Map<? extends K, ? extends V> var1) {
- this(Math.max((int)((float)var1.size() / 0.75F) + 1, 16), 0.75F);
- this.putAll(var1);
- }
-
- private static Object maskNull(Object var0) {
- return var0 == null ? NULL_KEY : var0;
- }
-
- private static <K> K unmaskNull(Object var0) {
- return (K)(var0 == NULL_KEY ? null : var0);
- }
-
- // $FF: renamed from: eq (java.lang.Object, java.lang.Object) boolean
- static boolean method_0(Object var0, Object var1) {
- return var0 == var1 || var0.equals(var1);
- }
-
- static int indexFor(int var0, int var1) {
- return var0 & var1 - 1;
- }
-
- private void expungeStaleEntries() {
- label25:
- while(true) {
- Entry var1;
- if ((var1 = (Entry)this.queue.poll()) != null) {
- int var2 = java.util.WeakHashMap.Entry.access$000(var1);
- int var3 = indexFor(var2, this.table.length);
- Entry var4 = this.table[var3];
- Entry var5 = var4;
-
- while(true) {
- if (var5 == null) {
- continue label25;
- }
-
- Entry var6 = java.util.WeakHashMap.Entry.access$100(var5);
- if (var5 == var1) {
- if (var4 == var1) {
- this.table[var3] = var6;
- } else {
- java.util.WeakHashMap.Entry.access$102(var4, var6);
- }
-
- java.util.WeakHashMap.Entry.access$102(var1, (Entry)null);
- java.util.WeakHashMap.Entry.access$202(var1, (Object)null);
- --this.size;
- continue label25;
- }
-
- var4 = var5;
- var5 = var6;
- }
- }
-
- return;
- }
- }
-
- private Entry[] getTable() {
- this.expungeStaleEntries();
- return this.table;
- }
-
- public int size() {
- if (this.size == 0) {
- return 0;
- } else {
- this.expungeStaleEntries();
- return this.size;
- }
- }
-
- public boolean isEmpty() {
- return this.size() == 0;
- }
-
- public V get(Object var1) {
- Object var2 = maskNull(var1);
- int var3 = HashMap.hash(var2.hashCode());
- Entry[] var4 = this.getTable();
- int var5 = indexFor(var3, var4.length);
-
- for(Entry var6 = var4[var5]; var6 != null; var6 = java.util.WeakHashMap.Entry.access$100(var6)) {
- if (java.util.WeakHashMap.Entry.access$000(var6) == var3 && method_0(var2, var6.get())) {
- return (V)java.util.WeakHashMap.Entry.access$200(var6);
- }
- }
-
- return null;
- }
-
- public boolean containsKey(Object var1) {
- return this.getEntry(var1) != null;
- }
-
- Entry<K, V> getEntry(Object var1) {
- Object var2 = maskNull(var1);
- int var3 = HashMap.hash(var2.hashCode());
- Entry[] var4 = this.getTable();
- int var5 = indexFor(var3, var4.length);
-
- Entry var6;
- for(var6 = var4[var5]; var6 != null && (java.util.WeakHashMap.Entry.access$000(var6) != var3 || !method_0(var2, var6.get())); var6 = java.util.WeakHashMap.Entry.access$100(var6)) {
- }
-
- return var6;
- }
-
- public V put(K var1, V var2) {
- Object var3 = maskNull(var1);
- int var4 = HashMap.hash(var3.hashCode());
- Entry[] var5 = this.getTable();
- int var6 = indexFor(var4, var5.length);
-
- for(Entry var7 = var5[var6]; var7 != null; var7 = java.util.WeakHashMap.Entry.access$100(var7)) {
- if (var4 == java.util.WeakHashMap.Entry.access$000(var7) && method_0(var3, var7.get())) {
- Object var8 = java.util.WeakHashMap.Entry.access$200(var7);
- if (var2 != var8) {
- java.util.WeakHashMap.Entry.access$202(var7, var2);
- }
-
- return (V)var8;
- }
- }
-
- ++this.modCount;
- Entry var9 = var5[var6];
- var5[var6] = new Entry(var3, var2, this.queue, var4, var9);
- if (++this.size >= this.threshold) {
- this.resize(var5.length * 2);
- }
-
- return null;
- }
-
- void resize(int var1) {
- Entry[] var2 = this.getTable();
- int var3 = var2.length;
- if (var3 == 1073741824) {
- this.threshold = Integer.MAX_VALUE;
- } else {
- Entry[] var4 = new Entry[var1];
- this.transfer(var2, var4);
- this.table = var4;
- if (this.size >= this.threshold / 2) {
- this.threshold = (int)((float)var1 * this.loadFactor);
- } else {
- this.expungeStaleEntries();
- this.transfer(var4, var2);
- this.table = var2;
- }
-
- }
- }
-
- private void transfer(Entry[] var1, Entry[] var2) {
- for(int var3 = 0; var3 < var1.length; ++var3) {
- Entry var4 = var1[var3];
-
- Entry var5;
- for(var1[var3] = null; var4 != null; var4 = var5) {
- var5 = java.util.WeakHashMap.Entry.access$100(var4);
- Object var6 = var4.get();
- if (var6 == null) {
- java.util.WeakHashMap.Entry.access$102(var4, (Entry)null);
- java.util.WeakHashMap.Entry.access$202(var4, (Object)null);
- --this.size;
- } else {
- int var7 = indexFor(java.util.WeakHashMap.Entry.access$000(var4), var2.length);
- java.util.WeakHashMap.Entry.access$102(var4, var2[var7]);
- var2[var7] = var4;
- }
- }
- }
-
- }
-
- public void putAll(Map<? extends K, ? extends V> var1) {
- int var2 = var1.size();
- if (var2 != 0) {
- if (var2 > this.threshold) {
- int var3 = (int)((float)var2 / this.loadFactor + 1.0F);
- if (var3 > 1073741824) {
- var3 = 1073741824;
- }
-
- int var4;
- for(var4 = this.table.length; var4 < var3; var4 <<= 1) {
- }
-
- if (var4 > this.table.length) {
- this.resize(var4);
- }
- }
-
- for(Map.Entry var6 : var1.entrySet()) {
- this.put(var6.getKey(), var6.getValue());
- }
-
- }
- }
-
- public V remove(Object var1) {
- Object var2 = maskNull(var1);
- int var3 = HashMap.hash(var2.hashCode());
- Entry[] var4 = this.getTable();
- int var5 = indexFor(var3, var4.length);
- Entry var6 = var4[var5];
-
- Entry var8;
- for(Entry var7 = var6; var7 != null; var7 = var8) {
- var8 = java.util.WeakHashMap.Entry.access$100(var7);
- if (var3 == java.util.WeakHashMap.Entry.access$000(var7) && method_0(var2, var7.get())) {
- ++this.modCount;
- --this.size;
- if (var6 == var7) {
- var4[var5] = var8;
- } else {
- java.util.WeakHashMap.Entry.access$102(var6, var8);
- }
-
- return (V)java.util.WeakHashMap.Entry.access$200(var7);
- }
-
- var6 = var7;
- }
-
- return null;
- }
-
- Entry<K, V> removeMapping(Object var1) {
- if (!(var1 instanceof Map.Entry)) {
- return null;
- } else {
- Entry[] var2 = this.getTable();
- Map.Entry var3 = (Map.Entry)var1;
- Object var4 = maskNull(var3.getKey());
- int var5 = HashMap.hash(var4.hashCode());
- int var6 = indexFor(var5, var2.length);
- Entry var7 = var2[var6];
-
- Entry var9;
- for(Entry var8 = var7; var8 != null; var8 = var9) {
- var9 = java.util.WeakHashMap.Entry.access$100(var8);
- if (var5 == java.util.WeakHashMap.Entry.access$000(var8) && var8.equals(var3)) {
- ++this.modCount;
- --this.size;
- if (var7 == var8) {
- var2[var6] = var9;
- } else {
- java.util.WeakHashMap.Entry.access$102(var7, var9);
- }
-
- return var8;
- }
-
- var7 = var8;
- }
-
- return null;
- }
- }
-
- public void clear() {
- while(this.queue.poll() != null) {
- }
-
- ++this.modCount;
- Entry[] var1 = this.table;
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- var1[var2] = null;
- }
-
- this.size = 0;
-
- while(this.queue.poll() != null) {
- }
-
- }
-
- public boolean containsValue(Object var1) {
- if (var1 == null) {
- return this.containsNullValue();
- } else {
- Entry[] var2 = this.getTable();
- int var3 = var2.length;
-
- while(var3-- > 0) {
- for(Entry var4 = var2[var3]; var4 != null; var4 = java.util.WeakHashMap.Entry.access$100(var4)) {
- if (var1.equals(java.util.WeakHashMap.Entry.access$200(var4))) {
- return true;
- }
- }
- }
-
- return false;
- }
- }
-
- private boolean containsNullValue() {
- Entry[] var1 = this.getTable();
- int var2 = var1.length;
-
- while(var2-- > 0) {
- for(Entry var3 = var1[var2]; var3 != null; var3 = java.util.WeakHashMap.Entry.access$100(var3)) {
- if (java.util.WeakHashMap.Entry.access$200(var3) == null) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public Set<K> keySet() {
- Set var1 = this.keySet;
- return var1 != null ? var1 : (this.keySet = new KeySet(this, (1)null));
- }
-
- public Collection<V> values() {
- Collection var1 = this.values;
- return var1 != null ? var1 : (this.values = new Values(this, (1)null));
- }
-
- public Set<Map.Entry<K, V>> entrySet() {
- Set var1 = this.entrySet;
- return var1 != null ? var1 : (this.entrySet = new EntrySet(this, (1)null));
- }
-
- // $FF: synthetic method
- static Object access$300(Object var0) {
- return unmaskNull(var0);
- }
-
- // $FF: synthetic method
- static int access$400(WeakHashMap var0) {
- return var0.modCount;
- }
-
- // $FF: synthetic method
- static Entry[] access$500(WeakHashMap var0) {
- return var0.table;
- }
- }
-